package metier;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;

import donnees.*;
import fabriques.*;


public class Metier extends UnicastRemoteObject implements IMetier{
	private static final long serialVersionUID = 1386498481154132990L;
	
	private FabCategorie fc;
	private FabProduit fp;
	private FabClient fcl;
	private FabAdresse fa;
	private FabCommande fcomm;
	private FabLigneCommande flcomm;
	
	public Metier() throws RemoteException{
		super();
		//on connecte toutes les fabriques ==> fait dans le constructeur des fabriques
		/*Connexion.getInstance();
		Connection con = Connexion.getCon();
		FabAdresse.setConnection(con);
		FabCategorie.setConnection(con);
		FabClient.setConnection(con);
		FabCommande.setConnection(con);
		FabLigneCommande.setConnection(con);
		FabProduit.setConnection(con);*/
		
		this.fc=FabCategorie.getInstance();
		this.fp=FabProduit.getInstance();
		this.fcl=FabClient.getInstance();
		this.fa=FabAdresse.getInstance();
		this.fcomm=FabCommande.getInstance();
		this.flcomm=FabLigneCommande.getInstance();
	}
	
	//---------------------------------------
	//Metier Creer compte
	//--------------------------------------
	public void creerCompte(String nom, String prenom, String mail,
			String motdepasse, String num, String rue, String cP, String ville) throws RemoteException{
		
		Adresse Adr= fa.creer(num, rue, cP, ville);
		fcl.creer(nom, prenom, mail, motdepasse, Adr.getId());
		
	}
	
	
	//---------------------------------------
	//Metier Panier
	//--------------------------------------
	public Panier ajouterAuPanier(Panier lePanier,int idProd) throws RemoteException{
		FabProduit fp=FabProduit.getInstance();
		Produit prodAAjouter=null;
		try{
			prodAAjouter = fp.rechercher(idProd);
		}catch (SQLException e) {
			e.printStackTrace();
		}
		int idProdAAjouter=prodAAjouter.getId();
		//on parcours le panier existant
		Iterator<PanierItem> itPI = lePanier.getLesPanierItems().iterator();
		boolean existe=false;
		while(itPI.hasNext()){
			PanierItem lePI=itPI.next();
			//si le produit qu'on veut ajouter est deja dans le panier on ajoute une qte
			if(lePI.getProd().getId()==idProdAAjouter){
				lePI.setQuantite(lePI.getQuantite()+1);
				existe=true;
				break;
			}
		}
		//si le produit n'existe pas dans le panier, on l'ajoute
		if(!existe){
			lePanier.getLesPanierItems().add(new PanierItem(prodAAjouter,1));
		}
		return lePanier;
	}
	
	
	public Panier retirerDuPanier(Panier lePanier, int idProd) throws RemoteException {
		//on parcours le panier existant
		Iterator<PanierItem> itPI = lePanier.getLesPanierItems().iterator();
		while(itPI.hasNext()){
			PanierItem lePI=itPI.next();
			//si la quantité est supérieure a zero
			if((lePI.getProd().getId()==idProd) && lePI.getQuantite()>1){
				lePI.setQuantite(lePI.getQuantite()-1);
			}
		}
		return lePanier;
	}
	
	
	public Panier supprimerDuPanier(Panier lePanier, int idProd) throws RemoteException {
		//on parcours le panier existant
		Iterator<PanierItem> itPI = lePanier.getLesPanierItems().iterator();
		while(itPI.hasNext()){
			PanierItem lePI=itPI.next();
			//si la quantité est supérieure a zero
			if(lePI.getProd().getId()==idProd){
				lePanier.getLesPanierItems().remove(lePI);
				break;
			}
		}
		return lePanier;
	}
	
	//-------------------------------------
	//Metier Tri Produits
	//-------------------------------------
	public ArrayList<Produit> getProduitsDeLaCategorieTrieParPrix(int idCateg) throws RemoteException{
		ArrayList<Produit> lesProds= fp.rechercherProduitsDeLaCategorie(idCateg);
	    for(int i = ( lesProds.size() - 1);  i > 0;  i--) {
	        for( int j=0;  j < i; j++) {
	            if (lesProds.get(j).getPrix() > lesProds.get(j+1).getPrix()) {
	                Produit pTemp= lesProds.get(j);
	                lesProds.set(j, lesProds.get(j+1));
	                lesProds.set(j+1, pTemp);
	            }
	        }
	    }
		return lesProds;
	}
	
	
	public ArrayList<Produit> getProduitsDeLaCategorieTrieParDispo(int idCateg) throws RemoteException{
		ArrayList<Produit> lesProds= fp.rechercherProduitsDeLaCategorie(idCateg);
		Collections.sort(lesProds);
		return lesProds;
	}
	
	
	//-------------------------------------
	//Metier Commandes
	//-------------------------------------
	public void enregistrerCommande(Client leClient, Panier lePanier) throws RemoteException{
		//on crée une commande et autant de ligne commande que de produit dans le panier
		Commande commande=fcomm.creer(new Date(), leClient.getId());
		Iterator<PanierItem> itPI = lePanier.getLesPanierItems().iterator();
		while(itPI.hasNext()){
			PanierItem lePI=itPI.next();
			flcomm.creer(lePI.getQuantite(), lePI.getProd().getId(), commande.getId());
		}
	}
	
	
	public ArrayList<Commande> getCommandesDuClient(int idclient) throws RemoteException {
		return fcomm.rechercherLesCommandesDuClient(idclient);
	}
	
	//-------------------------------------
	//Metier UTILS
	//-------------------------------------
	public ArrayList<Categorie> getCategories() throws RemoteException{
		return fc.lister();
	}
	
	
	public String getNomDeLaCategorie(int idCateg) throws RemoteException{
		try {
			return fc.rechercher(idCateg).getLibelle();
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	
	public ArrayList<Produit> getProduitsDeLaCategorie(int idCateg) throws RemoteException{
		return fp.rechercherProduitsDeLaCategorie(idCateg);
	}
	
	
	//Savoir si le mail est deja dans la base de donnees ou non
	public boolean mailIsInBDD(String mail) throws RemoteException{
		return fcl.mailIsInBDD(mail);
	}
	
	
	public Client rechercherClientParMail(String mail) throws SQLException, RemoteException{
		return fcl.rechercherViaMail(mail);
	}

	
	public Adresse getAdresseDuClient(int idClient) throws RemoteException{
		return fa.rechercherlAdresseDuClient(idClient);
	}
	
	
	public Adresse modifierAdresseDuClient(int idClient,String num, String rue, String CP, String ville) throws RemoteException{
		return fa.modifierlAdresseDuClient(idClient,num,rue,CP,ville);
	}
	
}
